package com.woniu.config;//package com.woniu.user.config;
//
//import cn.hutool.core.lang.Snowflake;
//
//import com.woniu.user.utils.JwtUtil;
//import com.woniu.user.utils.RedisUtil;
//
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.ExpiredJwtException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.web.servlet.HandlerInterceptor;
//import org.springframework.web.servlet.ModelAndView;
//
//import javax.security.auth.login.LoginException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
//@Component
//public class LoginInterceptor implements HandlerInterceptor {
//    @Autowired
//    private RedisUtil redisUtil;
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        //System.out.println("MyInterceptor1>>>preHandle");
//        //放行预检请求
//        if (request.getMethod().equals("OPTIONS")) {
//            return true;
//        }
//        String accessToken = request.getHeader("token");
//        if (accessToken==null){
//            throw new LoginException("还未登录");
//        }
//        //调用该方法会自动帮你校验,数据不对，则抛出异常(三种,格式,签名,时间过期)
//        //我们只需要在全局异常写上这三种异常即可
//
//        try {
//            Claims claims = JwtUtil.parseToken(accessToken);
//            if ((claims.getExpiration().getTime()-new Date().getTime())/1000<30){
//                throw new ExpiredJwtException(null,claims,"accessToken剩余时间不足");
//            }
//        } catch (ExpiredJwtException e) {
//            //accessToken 已过期
//            //取出refreshToken
//            String refreshToken = redisUtil.get(accessToken);
//            if (refreshToken==null){
//                System.out.println("长token过期了");
//                throw e;
//            }
//            Claims claims = JwtUtil.parseToken(refreshToken);
//            if ((claims.getExpiration().getTime()-new Date().getTime())/1000/60<10) {
//                System.out.println("长token不足10分钟");
//                //refreshToken 不足十分钟
//                throw e;
//            }
//            //15分钟未操作 重新生成长短 token
//            Map<String, Object> map = new HashMap<>();
//            map.put("accountId",claims.get("accountId"));
//            map.put("nickName",claims.get("nickName"));
//            //HashMap<String,Object> accessBody= BeanUtil.beanToMap(accountDto);
//
//            HashMap<String, Object> accessBody = new HashMap<>();
//            //使用雪花算法 生成随机值,确保用户的短token 不重复 因为用户有可能 在同一毫秒注册 而body是由用户注册的时间来决定的
//            String random = new Snowflake(1, 1).nextIdStr();
//            accessBody.put("random",random);
//            //生成双token  accessToken 用于返回前端 不带敏感信息
//            String newAccessToken = JwtUtil.createToken(accessBody, 15);
//            //refreshToken 存入redis 带敏感信息
//            String newRefreshToken = JwtUtil.createToken(map, 3*24*60);
//            //短token 返回给前端
//            response.setHeader("token",newAccessToken);
//            response.setHeader("Access-Control-Expose-Headers","token");
//            //长token保存到redis
//            redisUtil.set(newAccessToken,newRefreshToken);
//            //走到这里说明续期成功 我们为了防止31秒问题 再redis 存入一个变量 并设置有效期
//            //为30秒 (和上面的时间匹配) 我们在后置拦截器就通过判断这个键值对 是否 存在作为条件来删除
//            //长token
//            redisUtil.set("refresh:"+accessToken,"",30);
//
//        }
//
//        //redisUtil.set("refresh:"+accessToken,"",30);
////        if ((claims.getExpiration().getTime()-new Date().getTime())/1000<10) {
////            throw new ExpiredJwtException(null,claims,"jwt已过期");
////        }
//        return true;
//    }
//
//    @Override
//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        String accessToken = request.getHeader("token");
//        if (accessToken!=null){ //我们在后置拦截器就通过判断这个键值对 是否 存在作为条件来删除 长token
//            if (redisUtil.exist("refresh:"+accessToken)){ //存在 说明已完成续期 执行删除
//                redisUtil.del(accessToken);
//            }
//        }
//    }
//
//}